#ifndef _LT_SAVE_DATA_H_
#define _LT_SAVE_DATA_H_

#include <map>
#include <string>

namespace Lotus
{
	namespace mapformat
	{
		class Data;
		class MapObject;
	}

	struct InvalidTypeException:public std::exception
	{
		InvalidTypeException(const char* msg):std::exception(msg)
		{
		}
	};

	class LOTUS_API SaveValue
	{
	public:
		enum ValueType
		{
			String=1,
			Float=2,
			Int=3,
			Bool=4,
			Vector=5,
			Unknown=10
		}type;

		SaveValue(mapformat::Data* innerVal);
		SaveValue(const SaveValue& other);

		SaveValue& operator=(const SaveValue& val);
		SaveValue& operator=(int val);
		SaveValue& operator=(float val);
		SaveValue& operator=(const char* val);
		SaveValue& operator=(bool val);
		SaveValue& operator=(const Ogre::Vector3& val);

		operator int() const;
		operator float() const;
		operator bool() const;
		operator const char*() const;
		operator Ogre::Vector3() const;
	private:
		mapformat::Data* innerVal;
	};

	class LOTUS_API SaveData
	{
	friend class MapObject;
	public:
		SaveData(mapformat::MapObject* innerData);
		SaveValue& operator[](const char* key);
		const SaveValue& operator[](const char* key) const;
	//private:
		mutable std::map<std::string,SaveValue> dataMap;
		mapformat::MapObject* innerData;
	};
}

#endif